//
//  iBioCAD_Installer_AppDelegate.m
//  iBioCAD_Installer
//
//  Created by Orbitus on 12/7/07.
//  Copyright __MyCompanyName__ 2007 . All rights reserved.
//

#import "iBioCAD_Installer_AppDelegate.h"

@implementation iBioCAD_Installer_AppDelegate
-(void) awakeFromNib
{
	
}


- (IBAction) Install:(id) sender
{
	NSLog(@"Howdy....ready to install!");
	[installerIndicator startAnimation:self]; 
	myAppFolderPath	=	[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent];
	
	id installObjects = [[nuggetController arrangedObjects] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"download == 1" ]];
	
	NSMutableArray *myTasks = [[NSMutableArray alloc] init];
	NSMutableArray *myPipes = [[NSMutableArray alloc] init];
	int i;
	
	for(i = 0; i < [installObjects count]; i++ )
	{
		[myTasks addObject:[[NSTask alloc] init]];
		[myPipes addObject:[[NSPipe alloc] init]];
	}

	NSFileHandle *handle;
    NSString *string;

	
	//NSLog(@"%@",	[[[nuggetController arrangedObjects] objectAtIndex:0] valueForKey:@"install"] );
	
	//for (i=0; i<[installObjects count]; i++)
	for (i=0; i<1; i++)
	{
		[[myTasks objectAtIndex:i] setLaunchPath:[myAppFolderPath stringByAppendingPathComponent:@"iBioCAD_Installer.pl"]];
		[[myTasks objectAtIndex:i] setCurrentDirectoryPath:myAppFolderPath];
		
		id installationObjects = [NSMutableArray arrayWithObjects:[installationPath stringValue],nil];
		
		[installationObjects addObject:[[[[nuggetController arrangedObjects] objectAtIndex:0] valueForKey:@"install"] stringValue]];
		[installationObjects addObject:[[[[nuggetController arrangedObjects] objectAtIndex:1] valueForKey:@"install"] stringValue]];
		[installationObjects addObject:[[[[nuggetController arrangedObjects] objectAtIndex:2] valueForKey:@"install"] stringValue]];
		[installationObjects addObject:[[[[nuggetController arrangedObjects] objectAtIndex:3] valueForKey:@"install"] stringValue]];
		[installationObjects addObject:[[[[nuggetController arrangedObjects] objectAtIndex:4] valueForKey:@"install"] stringValue]];

		[[myTasks objectAtIndex:i] setArguments:installationObjects];
		[[myTasks objectAtIndex:i] setStandardOutput:[myPipes objectAtIndex:i]];
		handle=[[myPipes objectAtIndex:i] fileHandleForReading];
		[[myTasks objectAtIndex:i] launch];
		
		[NSThread detachNewThreadSelector:@selector(copyData:)
								 toTarget:self withObject:handle];
	}
	
}

- (void)copyData:(NSFileHandle*)handle {
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
    NSString *string=[[NSString alloc] initWithData:
					  [handle readDataToEndOfFile] encoding:NSASCIIStringEncoding];
    
    [textView setString:string];
	[installerIndicator stopAnimation:self];
    [string release];
    [pool release];
}

/**
    Returns the support folder for the application, used to store the Core Data
    store file.  This code uses a folder named "iBioCAD_Installer" for
    the content, either in the NSApplicationSupportDirectory location or (if the
    former cannot be found), the system's temporary directory.
 */

- (NSString *)applicationSupportFolder {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory();
    return [basePath stringByAppendingPathComponent:@"iBioCAD_Installer"];
}


/**
    Creates, retains, and returns the managed object model for the application 
    by merging all of the models found in the application bundle.
 */
 
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
	
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}


/**
    Returns the persistent store coordinator for the application.  This 
    implementation will create and return a coordinator, having added the 
    store for the application to it.  (The folder for the store is created, 
    if necessary.)
 */

- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }
	
    NSFileManager *fileManager;
    NSURL *url;
    NSError *error;
    
	myAppFolderPath	=	[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent];
	
    fileManager = [NSFileManager defaultManager];
    if ( ![fileManager fileExistsAtPath:myAppFolderPath isDirectory:NULL] ) {
        [fileManager createDirectoryAtPath:myAppFolderPath attributes:nil];
    }
    
    url = [NSURL fileURLWithPath: [myAppFolderPath stringByAppendingPathComponent: @"iBioCAD_Installer.data"]];
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSBinaryStoreType configuration:nil URL:url options:nil error:&error]){
        [[NSApplication sharedApplication] presentError:error];
    }    

    return persistentStoreCoordinator;
}


/**
    Returns the managed object context for the application (which is already
    bound to the persistent store coordinator for the application.) 
 */
 
- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    
    return managedObjectContext;
}


/**
    Returns the NSUndoManager for the application.  In this case, the manager
    returned is that of the managed object context for the application.
 */
 
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
    return [[self managedObjectContext] undoManager];
}


/**
    Performs the save action for the application, which is to send the save:
    message to the application's managed object context.  Any encountered errors
    are presented to the user.
 */
 
- (IBAction) saveAction:(id)sender {

    NSError *error = nil;
    if (![[self managedObjectContext] save:&error]) {
        [[NSApplication sharedApplication] presentError:error];
    }
}


/**
    Implementation of the applicationShouldTerminate: method, used here to
    handle the saving of changes in the application managed object context
    before the application terminates.
 */
 
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {

    NSError *error;
    int reply = NSTerminateNow;
    
    if (managedObjectContext != nil) {
        if ([managedObjectContext commitEditing]) {
            if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
				
                // This error handling simply presents error information in a panel with an 
                // "Ok" button, which does not include any attempt at error recovery (meaning, 
                // attempting to fix the error.)  As a result, this implementation will 
                // present the information to the user and then follow up with a panel asking 
                // if the user wishes to "Quit Anyway", without saving the changes.

                // Typically, this process should be altered to include application-specific 
                // recovery steps.  

                BOOL errorResult = [[NSApplication sharedApplication] presentError:error];
				
                if (errorResult == YES) {
                    reply = NSTerminateCancel;
                } 

                else {
					
                    int alertReturn = NSRunAlertPanel(nil, @"Could not save changes while quitting. Quit anyway?" , @"Quit anyway", @"Cancel", nil);
                    if (alertReturn == NSAlertAlternateReturn) {
                        reply = NSTerminateCancel;	
                    }
                }
            }
        } 
        
        else {
            reply = NSTerminateCancel;
        }
    }
    
    return reply;
}


/**
    Implementation of dealloc, to release the retained variables.
 */
 
- (void) dealloc {

    [managedObjectContext release], managedObjectContext = nil;
    [persistentStoreCoordinator release], persistentStoreCoordinator = nil;
    [managedObjectModel release], managedObjectModel = nil;
    [super dealloc];
}


@end
